10.1 Maximiere den Rand, aber soft#
Wir bleiben weiter bei den klassischen ML-Methoden und beschäftigen uns in diesem Kapitel mit den Support Vector Machines. Zunächst jedoch ergründen wir das Konzept, das hinter den Support Vector Machines steht.
Lernziele#
Lernziele
Sie kennen die Abkürzung SVM für Support Vector Machines.
Sie kennen die Idee, bei Support Vector Machines den Margin (= Randabstand) zu maximieren.
Sie wissen, was Stützvektoren bzw. Support Vectors sind.
Sie wissen, dass ein harter Randabstand nur bei linear trennbaren Datensätzen möglich ist.
Sie wissen, dass eigentlich nicht trennbare Datensätze mit der Technik Soft Margin (= weicher Randabstand) dennoch klassifiziert werden können.
Welche Trenngerade soll es sein?#
Support Vector Machines (SVM) können sowohl für Klassifikations- als auch Regressionsprobleme genutzt werden. Insbesondere wenn viele Merkmale (Features) vorliegen, sind SVMs gut geeignet. Auch neigen SVMs weniger zu Overfitting. Daher lohnt es sich, Support Vector Machines anzusehen.
Warum SVMs weniger zu Overfitting neigen und mit Ausreißern besser umgehen
können, sehen wir bereits an der zugrundeliegenden Idee, die hinter dem
Verfahren steckt. Um das Basis-Konzept der SVMs zu erläutern, erzeugen wir
künstliche Messdaten. Dazu verwenden wir die Funktion make_blobs aus dem
Scikit-Learn-Modul Datasets. Weitere Details zum Aufruf der Funktion finden
wir in der
Scikit-Learn-Dokumentation/make_blobs.
from sklearn.datasets import make_blobs
# generate artificial data
X, y = make_blobs(n_samples=60, centers=2, random_state=0, cluster_std=0.50)
print(X)
print(y)
[[ 1.4726926 1.3480769 ]
[ 0.5323772 3.31338909]
[ 1.74265969 5.03846671]
[ 1.72330962 4.2012082 ]
[ 0.4519936 3.59377836]
[ 1.84845803 0.52393625]
[ 1.61986895 0.60823883]
[ 1.62465468 1.85269614]
[ 3.01673853 1.63792106]
[ 2.23345072 1.25095024]
[ 1.60161834 0.92363636]
[ 0.802314 4.38196181]
[ 2.11872357 1.09865834]
[ 1.05374379 4.49286859]
[ 0.16932115 4.19741719]
[ 0.92466065 4.50908658]
[ 1.42002502 1.38236201]
[ 0.12313498 5.27917503]
[ 1.85367905 1.5088862 ]
[ 1.89949126 0.92574633]
[ 0.96217896 4.51795326]
[ 1.35678894 4.36462484]
[ 0.72144399 4.08475018]
[ 0.64003985 4.12401075]
[ 2.99684287 0.22378413]
[ 0.56969694 3.44064603]
[ 0.78260667 4.15263595]
[ 1.45131429 4.22810872]
[-0.30022483 4.63059663]
[ 1.59141542 4.90497725]
[ 1.92126584 1.29889186]
[ 2.14398059 0.69677319]
[ 2.20438661 1.56085661]
[ 0.99914934 4.2101954 ]
[ 1.91004907 3.81514839]
[ 1.19820169 4.47062449]
[ 2.79939362 1.84560825]
[ 0.72086751 3.71347124]
[ 1.51989121 1.42488952]
[ 2.62496786 0.28025075]
[ 2.4198128 0.96215512]
[ 0.3498724 4.69253251]
[ 2.24348029 0.34796326]
[ 1.13280393 3.87673946]
[ 0.65910903 4.12241674]
[ 2.11114739 3.57660449]
[ 2.52889351 0.82015861]
[ 1.24016835 1.12905479]
[ 2.989047 1.35068599]
[ 2.15940501 1.38598318]
[ 1.46870582 1.86947425]
[ 1.00952869 4.45502328]
[ 2.06051753 1.79059891]
[ 1.04829186 5.03092408]
[ 0.5285368 4.49723858]
[ 2.64465731 0.80770124]
[ 2.36230721 1.358767 ]
[ 1.40848818 3.93270482]
[ 2.28809874 0.12954182]
[ 2.25643834 0.55525861]]
[1 0 0 0 0 1 1 1 1 1 1 0 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 1
0 1 1 1 0 1 0 0 0 1 1 1 1 1 0 1 0 0 1 1 0 1 1]
Die Funktion make_blobs erzeugt standardmäßig zwei Input-Features, da die
Option n_features auf den Wert 2 voreingestellt ist, und einen Output, bei dem
die Labels entweder durch 0 oder 1 gekennzeichnet sind. Durch die Option
random_state=0 wird der Zufall ausgeschaltet.
Wenn wir die Daten in ein Pandas-DataFrame packen und anschließend visualisieren, erhalten wir folgenden Plot.
import pandas as pd
import plotly.express as px
daten = pd.DataFrame({
'Feature 1': X[:,0],
'Feature 2': X[:,1],
'Status': y.astype(bool),
})
fig = px.scatter(daten, x = 'Feature 1', y = 'Feature 2', color='Status',
title='Künstliche Daten', color_discrete_sequence=['#b40426','#3b4cc0'])
fig.show()
Wir können uns jetzt verschiedene Geraden vorstellen, die die blauen Punkte von den roten Punkten trennen. In der folgenden Grafik sind drei eingezeichnet. Welche würden Sie nehmen und warum?
Fig. 10 Drei Geraden trennen die roten von den blauen Punkten, aber welche ist die bessere Wahl? (Quelle: eigene Darstellung; Lizenz CC-BY-NC-SA 4.0)#
Alle drei Geraden trennen die blauen von den roten Punkten. Jedoch könnte Gerade 3 problematisch werden, wenn beispielsweise ein neuer blauer Datenpunkt an der Position (2.3, 3.3) dazukäme. Dann würde Gerade 3 diesen Punkt als rot klassifizieren. Ähnlich verhält es sich mit Gerade 1. Ein neuer blauer Datenpunkt an der Position (0.5, 3) würde fälschlicherweise als rot klassifiziert werden. Gerade 2 bietet den sichersten Abstand zu den bereits vorhandenen Datenpunkten. Wir können diesen “Sicherheitsstreifen” folgendermaßen visualisieren.
Fig. 11 Ein Sicherheitsstreifen bzw. breiter Rand, im Englischen Margin genannt, trennt die beiden Klassen. (Quelle: eigene Darstellung; Lizenz CC-BY-NC-SA 4.0)#
Der Support-Vector-Algorithmus sucht nun die Gerade, die die Datenpunkte mit dem größten Randabstand (= Margin) voneinander trennt. Im Englischen sprechen wir daher auch von Large Margin Classification. Die Suche nach dieser Geraden ist dabei etwas zeitaufwändiger als die Berechnung der Gewichte bei der logistischen Regression. Wenn aber einmal das Modell trainiert ist, ist die Prognose effizienter, da nur die sogenannten Stützvektoren, auf englisch Support Vectors gespeichert und ausgewertet werden. Die Stützvektoren sind die Vektoren, die vom Ursprung des Koordinatensystems zu den Punkten zeigen, die auf der Grenze des Sicherheitsbereichs liegen.
Fig. 12 Einige wenige Punkte (gelb markiert) bestimmen den Verlauf des Randabstandes. Die Vektoren, die vom Ursprung des Koordinatensystems zu diesen Punkten zeigen, werden Stützvektoren (= Support Vectors) genannt. (Quelle: eigene Darstellung; Lizenz CC-BY-NC-SA 4.0)#
Großer, aber weicher Randabstand#
Die bisherigen Beispiele zeigten perfekt trennbare Daten. In der Praxis sind
Datensätze jedoch oft nicht linear trennbar. Für den Fall, dass einige wenige
Datenpunkte “falsch” liegen, erlauben wir Ausnahmen. Wie viele Ausnahmen wir
erlauben wollen, die im Sicherheitsstreifen liegen, steuern wir mit dem
Parameter C. Ein großes C bedeutet, dass wir eine große Mauer an den Grenzen
des Sicherheitsabstandes errichten. Es kommt kaum vor, dass Datenpunkte
innerhalb des Margins liegen. Je kleiner C wird, desto mehr Datenpunkte sind
innerhalb des Sicherheitsbereichs erlaubt.
Im Folgenden betrachten wir einen neuen künstlichen Datensatz, bei dem die
blauen von den roten Punkte nicht mehr ganz so stark getrennt sind. Schauen Sie
sich die fünf verschiedenen Margins an, die entstehen, wenn der Parameter C
variiert wird.
Zusammenfassung#
In diesem Abschnitt haben wir die Ideen kennengelernt, die den Support Vector Machines zugrunde liegen. Im nächsten Abschnitt schauen wir uns an, wie ein SVM-Modell mit Scikit-Learn trainiert wird.